﻿using System.Collections.Generic;
using System.Data;
using System.Linq;

namespace CRM.Database.Model
{
    public partial class TrainingsSchedules : IGetKeyValue, IGetNamesValues
    {
        #region Implementation of IGetKeyValue

        /// <summary>
        /// Получение ключего значения элемента
        /// </summary>
        /// <returns>Ключевое значение</returns>
        public int GetKeyValue()
        {
            return IdTrainingsSchedule;
        }

        #endregion

        #region Extended properties

        /// <summary>
        /// Продолжительность курса
        /// </summary>
        public double Duration
        {
            get
            {
                if (this.TrainingsCourses != null)
                    return this.TrainingsCourses.Duration;
                return 0;
            }
        }

        /// <summary>
        /// Название курса
        /// </summary>
        public string CourseName
        {
            get { return TrainingsCourses != null ? TrainingsCourses.Name : ""; }
        }

        /// <summary>
        /// Текстовое поле для ссылки
        /// </summary>
        public string LinkText
        {
            get { return "Подать заявку"; }
        }

        /// <summary>
        /// Русское название региона профайн
        /// </summary>
        public string profineRegionName
        {
            get { return profineRegions != null ? profineRegions.NameRu : ""; }
        }

        /// <summary>
        /// Название курса
        /// </summary>
        public string CourseType
        {
            get
            {
                if (TrainingCoursesTypes != null)
                {
                    if (TrainingCoursesTypes.NameRu != null)
                    {
                        return TrainingCoursesTypes.NameRu;
                    }
                }
                return "Не определен";
            }
        }

        /// <summary>
        /// Дата курса
        /// </summary>
        public string ShowPlannedDate
        {
            get { return PlannedDate.Date.ToShortDateString(); }
        }

        /// <summary>
        /// Список курсов
        /// </summary>
        public List<TrainingsCourses> TrainingsCoursesList
        {
            get
            {
                var coursesCol = new TrainingsCoursesCollection();
                return coursesCol.TrainingsCoursesList;
            }
        }

        /// <summary>
        /// Название Рубрики
        /// </summary>
        public string RubricName
        {
            get
            {
                if (TrainingsCourses != null)
                    if (TrainingsCourses.Rubrics != null)
                        if (TrainingsCourses.Rubrics.NameRu != null)
                            return TrainingsCourses.Rubrics.NameRu;
                return "";
            }
        }

        /// <summary>
        /// Название Города. Из площадки или напрямую.
        /// </summary>
        public string CityName
        {
            get
            {
                if (IdTrainingsCity != null)
                {
                    var citiesCol = new TrainingsCitiesCollection();
                    var city = (TrainingsCities) citiesCol.GetItemById((int) IdTrainingsCity);
                    if (city != null)
                    {
                        return city.TrainingsCityName;
                    }
                }
                if (TrainingsPlaces != null)
                    if (TrainingsPlaces.TrainingsCityName != null)
                        return TrainingsPlaces.TrainingsCityName;
                return "";
            }
        }

        /// <summary>
        /// Заявленное кол-во участников
        /// </summary>
        public int ParticipantsCountRequested
        {
            get
            {
                var participantsCol = new TrainingsParticipantsCollection();
                List<TrainingsParticipants> participants =
                    participantsCol.GetParticipantsByScheduleId(IdTrainingsSchedule);
                return participants.Count;
            }
        }

        /// <summary>
        /// Одобренное кол-во участников
        /// </summary>
        public int ParticipantsCountApproved
        {
            get
            {
                var participantsCol = new TrainingsParticipantsCollection();
                List<TrainingsParticipants> participants =
                    participantsCol.GetParticipantsByScheduleId(IdTrainingsSchedule);
                int count = 0;
                foreach (TrainingsParticipants item in participants)
                {
                    if (item.IdTrainingsParticipantsStatus == 3
                        || item.IdTrainingsParticipantsStatus == 4
                        || item.IdTrainingsParticipantsStatus == 7
                        || item.IdTrainingsParticipantsStatus == 9
                        ) count++;
                }
                return count;
            }
        }

        /// <summary>
        /// Фактическое кол-во участников
        /// </summary>
        public int ParticipantsCountActual
        {
            get
            {
                var participantsCol = new TrainingsParticipantsCollection();
                List<TrainingsParticipants> participants =
                    participantsCol.GetParticipantsByScheduleId(IdTrainingsSchedule);
                //var participants = DB.GetTrainingsParticipantsByScheduleId(this.IdTrainingsSchedule);
                int count = 0;
                foreach (TrainingsParticipants item in participants)
                {
                    if (item.IdTrainingsParticipantsStatus == 3
                        || item.IdTrainingsParticipantsStatus == 4
                        || item.IdTrainingsParticipantsStatus == 7
                        ) count++;
                }
                return count;
            }
        }

        /// <summary>
        /// Стоимость одного участника
        /// </summary>
        public float ParticipantCoctExt
        {
            get
            {
                if (CourseCost > 0 && ParticipantsCountActual > 0)
                    return (float) CourseCost/ParticipantsCountActual;
                return 0;
            }
        }

        /// <summary>
        /// Допустимое кол-во участников
        /// </summary>
        public int ParticipantsCountAvailable
        {
            get
            {
                if (TrainingsCourses != null)
                    return TrainingsCourses.ParticipantCount;
                return 0;
            }
        }

        /// <summary>
        /// хз для чего?
        /// </summary>
        public int IdTrainingCoursesType1 { get; set; }

        /// <summary>
        /// Возвращает имя площaдки + (имя города) для плановых курсов. Для выездных - город.
        /// Для вебиноров - название площадки. Используется в отображении календаря
        /// </summary>
        public string LocationName
        {
            get
            {
                string result = "";
                //для плановых курсов
                if (IdTrainingCoursesType == 1)
                {
                    if (TrainingsPlaces != null)
                    {
                        result = TrainingsPlaces.NameRu;
                    }
                    result = result + "(г. " + CityName + ")";
                }
                //для выездных курсов
                if (IdTrainingCoursesType == 2)
                {
                    result = CityName;
                }
                //для вебинаров
                if (IdTrainingCoursesType == 3)
                {
                    if (TrainingsPlaces != null)
                    {
                        result = TrainingsPlaces.NameRu;
                    }
                }
                return result;
            }
        }

        /// <summary>
        /// Тип курса, если есть
        /// </summary>
        public string CourseTypeLocalazed
        {
            get
            {
                if (TrainingsCourses != null)
                    if (TrainingCoursesTypes != null)
                    {
                        return TrainingCoursesTypes.LocalizedName;
                    }
                return "Не определен";
            }
        }

        /// <summary>
        /// Имя тренера
        /// </summary>
        public string TrainerName
        {
            get
            {
                if (IdTrainingsTrainer < 1) return "";
                var trainersCol = new TrainingsTrainersCollection();
                var trainer = (TrainingsTrainers) trainersCol.GetItemById(IdTrainingsTrainer);
                if (trainer == null) return "";
                return trainer.Name ?? "";
            }
        }

        /// <summary>
        /// статус 
        /// </summary>
        public string CourseStatus
        {
            get
            {
                if (TrainingCoursesStatuses != null)
                    return TrainingCoursesStatuses.LocalizedName;
                return " ";
            }
        }

        /// <summary>
        /// Формирование DataTable для списка охраны
        /// </summary>
        public DataTable MembersListTable
        {
            get
            {
                //таблица с результатом
                var resultTable = new DataTable();

                //формирование столбцов таблицы
                resultTable.Columns.Add("Number", typeof (string)); //1
                resultTable.Columns.Add("ParticipantName", typeof (string)); //2
                resultTable.Columns.Add("ParticipantPosition", typeof (string)); //3
                resultTable.Columns.Add("Company", typeof (string)); //4
                resultTable.Columns.Add("LegalEntityName", typeof (string)); //5
                resultTable.Columns.Add("ContactPhone", typeof (string)); //6

                //вспомогательные коллекции
                var participantsCol = new TrainingsParticipantsCollection();

                //получение списка участников запланированного курса
                List<TrainingsParticipants> participantsList =
                    participantsCol.GetParticipantsByScheduleId(IdTrainingsSchedule);
                if (participantsList.Count < 1) return resultTable;

                //цикл по участникам и заполнение
                int i = 1;
                foreach (TrainingsParticipants participant in participantsList)
                {
                    if (!participant.IsInclude) continue;
                    DataRow row = resultTable.NewRow();
                    row["Number"] = i++;
                    row["ParticipantName"] = participant.ParticipantName;
                    row["ParticipantPosition"] = participant.ParticipantPosition;
                    row["Company"] = participant.CompanyName;
                    row["LegalEntityName"] = participant.ContactName;
                    row["ContactPhone"] = participant.ContactPhone;
                    resultTable.Rows.Add(row);
                }
                return resultTable;
            }
        }

        /// <summary>
        /// Дата курса в сокращенном текстовом формате
        /// </summary>
        public string PlannedDateExt
        {
            get { return PlannedDate.ToShortDateString(); }
        }

        /// <summary>
        /// Возвращает True если расписание можно редактировать
        /// </summary>
        public bool IsActual
        {
            get
            {
                if (this.TrainingsCourses != null)
                {
                    return TrainingsCourses.IsActive;
                }
                
                //if (this.TrainingCoursesStatuses != null)
                //    if (this.TrainingCoursesStatuses.IdTrainingCoursesStatus > 4)
                //        return false;
                
                return true;
            }
        }

        //название клиента для выедного курса
        public string CustomerName
        {
            get
            {
                if(this.TrainingsCourses.IsRemote)
                {
                    var requestsCol = new TrainingsRequestsCollection();
                    var request = requestsCol.TrainingsRequestsList.Where(p => p.IdTrainingsSchedule == this.IdTrainingsSchedule).FirstOrDefault();
                    if (request != null)
                        return request.CustomerName;
                }
                return "";
            }
        }

        #endregion

        #region Implementation of IGetNamesValues

        /// <summary>
        /// Получение списка имён
        /// </summary>
        /// <returns>Список имён</returns>
        public List<string> GetNamesValues()
        {
            var list = new List<string>();

            list.Add(CourseName);

            return list;
        }

        #endregion
    }
}